package pl.iddqd.tester.image;

import javax.microedition.lcdui.Image;

/**
 * Klasa obrazu.<br />
 * Przechowuje kilka modeli kolorów oraz statystyki: histogram.<br />
 * <br />
 * Napisana niezgodnie z zasadami Javovania aby podkr�ci� szybko�� dzi�ania.
 * 
 * @author Tomasz Drobiszewski
 * @version %I%, %G%
 */
public class ColorImage {

	/**
	 * Obraz
	 */
	Image image;

	/**
	 * Piksele obrazka w postaci [ARGB,ARGB,ARGB, ...] A - kana�a alpha R -
	 * czerwony G - zielony B - niebieski
	 */
	int[] raw;

	/**
	 * Piksele obrazka w postaci [R,G,B,R,G,B, ...] R - czerwony G - zielony B -
	 * niebieski
	 * 
	 */
	int[] rgbIm;
	

	/**
	 * Piksele obrazka w postaci [CHSV,CHSV,CHSV,...] 
	 * C - indeks naturalnego opisu koloru
	 * H - składowa H modelu HSV
	 * S - składowa S modelu HSV
	 * V - składowa V modelu HSV
	 * 
	 */
	int[] hsvIm;

	/**
	 * Histogram kolorów naturalnych w obrazie.
	 */
	int[] hcHistogram = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
			0, 0 };

	/**
	 * Szerokość obrazu
	 */
	int width;

	/**
	 * Wysokość obrazu
	 */
	int height;

	/**
	 * Ustawia obraz, wysokość oraz szerokość
	 * 
	 * @param im
	 */
	public ColorImage(Image im) {
		this.image = im;

		width = image.getWidth() / 2;
		height = image.getHeight() / 2;
	}

	/**
	 * Metoda uzupełnia tablicę: 
	 * hsvIm,
	 * histogram
	 * 
	 */
	public void computeColorModels() {
		try {
			raw	= new int[width * height];
			hsvIm= new int[width * height];
			
			//rgbIm = new int[width * height * 3];
			image.getRGB(raw, 0, width, 50, 50, width, height);
			int r, g, b;

			int [] hc = new int[4];
			for (int i = 0; i < raw.length; i++) {
				int ARGB = raw[i];
				// int a = (ARGB & 0xff000000) >> 24;//alpha
				//rgbIm[n + 0] = (ARGB & 0xff0000) >> 16;// r
				//rgbIm[n + 1] = (ARGB & 0xff00) >> 8;// g
				//rgbIm[n + 2] = ARGB & 0xff;// b
				r = (ARGB & 0xff0000) >> 16;// r
				g = (ARGB & 0xff00) >> 8;// g
				b = ARGB & 0xff;// b

				hc = Color.getHumanColor(r, g, b);
				hsvIm[i] = hc[3]<<24 | hc[2]<<16 | hc[1]<<8 | hc[0] ;
				hcHistogram[hc[3]] += 1;
			}

		} catch (RuntimeException e) {
			e.printStackTrace();
		}
	}

	public void convolve(int[] kernel) {
		int newImg[] = new int[width * height];
		//TODO usunąć
		int [] img = new int [10];
		for (int i = 1; i < height - 1; i++)
			for (int j = 1; j < width - 1; j++) {
				System.err.println("[" + i + "][" + j + "]");
				newImg[i * width + j] = img[(i - 1) * width + j - 1] * kernel[0]
						+ img[(i - 1) * width + j] * kernel[1]
						+ img[(i - 1) * width + j + 1] * kernel[2]
						+ img[i * width + j - 1] * kernel[3] + img[i * width + j]
						* kernel[4] + img[i * width + j + 1] * kernel[5]
						+ img[i + 1 * width + j - 1] * kernel[6]
						+ img[i + 1 * width + j] * kernel[7]
						+ img[i + 1 * width + j] * kernel[8];
			}

	}

	public int[] getHcHistogram() {
		return hcHistogram;
	}

	public void setHcHistogram(int[] hcHistogram) {
		this.hcHistogram = hcHistogram;
	}	

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	public Image getImage() {
		return image;
	}

	public void setImage(Image image) {
		this.image = image;
	}

	public int[] getRaw() {
		return raw;
	}

	public void setRaw(int[] raw) {
		this.raw = raw;
	}

	public int[] getRgbIm() {
		return rgbIm;
	}

	public void setRgbIm(int[] rgbIm) {
		this.rgbIm = rgbIm;
	}

	public int getWidth() {
		return width;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public int[] getHsvIm() {
		return hsvIm;
	}

	public void setHsvIm(int[] hsvIm) {
		this.hsvIm = hsvIm;
	}

}
